package Singleton.singleton;

import Singleton.interfaces.Singleton;

/**
 * 双重锁校验
 * 首先检查对象是否创建，如果未创建才进行同步，这样一来，只有第一次会同步
 * volatile关键字确保，当singleton变量被初始化成DoubleCheckedLocking对象时，多个线程正确处理singleton变量
 * <p>
 * 当一个变量定义为 volatile 之后，将具备两种特性：
 * 1.保证此变量对所有的线程的可见性
 * 2.禁止指令重排序优化
 *
 * 此方法性能较高，能降低系统耗费的时间
 * @Author: pengzx
 * @Description:
 * @Date: 17:30 2017/9/11
 * @Modified by: 1.0
 */
public class DoubleCheckedLocking extends Singleton {

    private volatile static DoubleCheckedLocking singleton;

    private DoubleCheckedLocking()
    {
        say = "你好...双重锁校验！";
    }

    public static DoubleCheckedLocking getInstance()
    {
        if (singleton == null) {
            synchronized (DoubleCheckedLocking.class) {
                singleton = new DoubleCheckedLocking();
            }
        }

        return singleton;
    }

    @Override
    public void say()
    {
        System.out.println(say);
    }
}
